<?php
/**
 * Created by PhpStorm.
 * User: ybjaa
 * Date: 2017/4/19
 * Time: 16:38
 */

namespace App;

use Mockery\Exception;
use phpDocumentor\Reflection\Types\Mixed;
use ReflectionProperty;

class Units
{

    /**
     *
     * 1.获得某个目录下所有文件的全路径
     *
     * @param $path 获得该文件下所有文件目录
     * @param $files 文件路径
     *
     */
    static public function getFilePath($path)
    {

        if(strtoupper(substr(PHP_OS,0,3))==='WIN')
        {
            if(strrpos($path,"\\")!==strlen($path)-1)
            {
                $path=$path."\\";
            }
        }else
        {
            if(strrpos($path,"/")!==strlen($path)-1)
            {
                $path=$path."/";
            }
        }




        $files=[];
        $array= array_map(function ($a) use ($path){

            if($a!=="."&&$a!="..")
            {
                return $path.$a;
            }else
            {
                return "";
            }

        },scandir($path));



        foreach ($array as $file)
        {
            switch ($file)
            {
                case null:  break;
                case "":    break;
                case ".":   break;
                case "..":  break;
                case is_file($file)===true:
                    $files[]=$file;
                    break;
                case is_dir($file)==true:
                $files=array_merge(self::getFilePath($file),$files);
                break;
                default:break;

            }
        }

        return $files;


    }


    /**
     * 数组转对象
     *
     * @param array $array 数据源
     * @param $obj 转换的class(::class)的类对象
     * @return array 转换后的对象数组
     */
    public static function ArrayToObject(Array $array,$obj)
    {

         $reflection=(new \ReflectionClass($obj));

        return array_map(function($cur)use($reflection)
        {
            $m=$reflection->newInstance();

            foreach ($cur as $k=>$v)
            {
                try
                {
                    $m->$k=$v;
                }catch (\Exception $ex)
                {

                }

            }

            return $m;
        },$array);
    }



    /**
     * 对象转对象
     *
     * @param array $array 数据源（对象数组）
     * @param $obj 转换的class(::class)的类对象
     * @return array 转换后的对象数组
     */
    public static function ConvertObjectToObject($array,$obj)
    {

        $reflection=(new \ReflectionClass($obj));
        $from=null;
        $properties=null;
        return array_map(function($cur)use($reflection)
        {
            $to=$reflection->newInstance();

            //反射属性
            $properties=$reflection->getProperties(
                ReflectionProperty::IS_PUBLIC |
                ReflectionProperty::IS_PROTECTED |
                ReflectionProperty::IS_PRIVATE);

            foreach ($properties as $p){
                try{

                    $value=null;
                    try{
                        $value=$cur->$p->getName();
                    }catch (\Exception $ex){
                        continue;
                    }
                    if($value){
                        $p->setAccessible(true);
                        $p->setValue($to,$value);
                    }
                }catch (\Exception $ex){
                    continue;
                }

            }

            return $to;
        },$array);
    }


    /**
     * 数组转对象
     *
     * @param array $array 数据源（数组）
     * @param $obj 转换的class(::class)的类对象
     * @return array 转换后的对象数组
     */
    public static function ConvertArrayToObject($array,$obj)
    {

        $reflection=(new \ReflectionClass($obj));
        $from=null;
        $properties=null;
        return array_map(function($cur)use($reflection)
        {
            $to=$reflection->newInstance();

            //反射属性
            $properties=$reflection->getProperties(
                ReflectionProperty::IS_PUBLIC |
                ReflectionProperty::IS_PROTECTED |
                ReflectionProperty::IS_PRIVATE);

            foreach ($properties as $p){
                try{

                    $value=null;
                    try{
                        $value=$cur["{$p->getName()}"];
                    }catch (\Exception $ex){
                        continue;
                    }
                    if($value){
                        $p->setAccessible(true);
                        $p->setValue($to,$value);
                    }
                }catch (\Exception $ex){
                    continue;
                }

            }

            return $to;
        },$array);
    }



}